In the event of a #PF while in an EFI runtime service function we
otherwise can't dump the page tables, making the analysis of the
problem more cumbersome.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
*/
#include <xen/domain_page.h>
+#include <xen/efi.h>
#include <xen/mm.h>
#include <xen/perfc.h>
#include <xen/pfn.h>
*/
if ( unlikely(pagetable_is_null(v->arch.guest_table)) && is_pv_vcpu(v) )
{
+ unsigned long cr3;
+
/* If we really are idling, perform lazy context switch now. */
if ( (v = idle_vcpu[smp_processor_id()]) == current )
sync_local_execstate();
/* We must now be running on the idle page table. */
- ASSERT(read_cr3() == __pa(idle_pg_table));
+ ASSERT((cr3 = read_cr3()) == __pa(idle_pg_table) ||
+ (efi_enabled && cr3 == efi_rs_page_table()));
}
return v;
void __init efi_init_memory(void) { }
+paddr_t efi_rs_page_table(void)
+{
+ BUG();
+ return 0;
+}
+
unsigned long efi_get_time(void)
{
BUG();
stts();
}
+paddr_t efi_rs_page_table(void)
+{
+ return virt_to_maddr(efi_l4_pgtable);
+}
+
unsigned long efi_get_time(void)
{
EFI_TIME time;
struct compat_pf_efi_runtime_call;
void efi_init_memory(void);
+paddr_t efi_rs_page_table(void);
unsigned long efi_get_time(void);
void efi_halt_system(void);
void efi_reset_system(bool_t warm);